/*******************************************************************************
* FileName:         Haffman.h
* Author:           李智铭
* Student Number:   3022206093
* Date:             2024/11/20 17:00:00
* Version:          v1.0
* Description:      Data Structure Experiment #9
*******************************************************************************/

#ifndef HUFFMANTREE_H
#define HUFFMANTREE_H

#include <string>
#include <unordered_map>
using namespace std;

class HuffmanTree{
private:
    struct node{
        char ch;
        int fre;
        node* leftchild;
        node* rightchild;

        node(char c, int n){  //赋值构造函数
            ch = c;
            fre = n;
            leftchild = nullptr;
            rightchild = nullptr;
        }

        bool operator>(const node& temp){  //重载比较符
            return(fre > temp.fre);
        }
    };

    node* root; //根节点
    unordered_map<char,string> codeTable;  //编码表

public:
    /**
     *  构造函数
        @name HuffmanTree(const int* Table)
        @param arg1 数字出现的频度表
        @return
        注意： 要求树的左孩子为权制较小的编码，左孩子的二进制编号为0
    */
    HuffmanTree(const int* Table);
    void buildCodeTable(node* node, const string& code);  //辅助函数

    /**
     *  析构函数
        @name ~HuffmanTree()
        @param 
        @return
    */
    ~HuffmanTree();
    void deleteroot(node* Node);  //辅助函数

    /**
     *  获取message的霍夫曼编码
        @name string Encode(string)
        @param  arg1 待编码待字符串
        @return 对应的霍夫曼编码
    */
    string Encode(string message);


    /**
     *  获取message的霍夫曼解码
        @name string Decode(stirng)
        @param 
        @return 解码出的内容
    */
    string Decode(string message);
};

#endif